package main

import (
	"log"
	"os"
	"os/signal"
	"sync"
	"syscall"
)

func main() {
	// 设置日志输出
	log.SetOutput(os.Stdout)
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

	// 加载配置
	config, err := LoadConfig("config.yaml")
	if err != nil {
		log.Fatalf("加载配置文件失败: %v", err)
	}

	// 验证配置
	if len(config.Services) == 0 && len(config.Servers) == 0 {
		log.Fatal("配置文件中没有定义任何服务或服务器")
	}

	if config.Email.SMTPServer == "" || config.Email.Username == "" || config.Email.Password == "" {
		log.Fatal("邮件配置不完整")
	}

	var wg sync.WaitGroup
	stopChan := make(chan struct{})

	// 设置信号处理
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

	// 启动服务监控
	enabledServices := 0
	for _, service := range config.Services {
		if service.Enabled {
			enabledServices++
		}
	}

	if enabledServices > 0 {
		log.Printf("开始监控 %d 个服务...", enabledServices)
		for _, service := range config.Services {
			if service.Enabled {
				wg.Add(1)
				go func(s ServiceConfig) {
					defer wg.Done()
					MonitorService(&s, &config.Email, stopChan)
				}(service)
			}
		}
	}

	// 启动服务器监控
	enabledServers := 0
	for _, server := range config.Servers {
		if server.Enabled {
			enabledServers++
		}
	}

	if enabledServers > 0 {
		log.Printf("开始监控 %d 个服务器...", enabledServers)
		for _, server := range config.Servers {
			if server.Enabled {
				wg.Add(1)
				go func(s ServerConfig) {
					defer wg.Done()
					MonitorServer(&s, &config.Email, stopChan)
				}(server)
			}
		}
	}

	// 等待中断信号
	go func() {
		sig := <-sigChan
		log.Printf("接收到信号 %v，正在停止服务...", sig)
		close(stopChan)
	}()

	// 等待所有监控协程完成
	wg.Wait()
	log.Println("服务已安全停止")
}
